/**
******************************************************************************
  * @file           : studio_pid_c.h
  * @author         : wangyingjie
  * @brief          : None
  * @attention      : None
  * @date           : 2025/5/23
  ******************************************************************************
  */
#ifndef STUDIO_PID_C_H
#define STUDIO_PID_C_H

#include <stdint.h>

typedef struct
{
    double initval; // 初始值
    double goal; // 目标值
    double error; // 当前误差（目标值 - 当前值）
    double Kp; // 比例常数
    double Ki; // 积分常数
    double Kd; // 微分常数
    double prev_error; // 前一个误差
    double inte_error; // 积分误差
    double dif_error; // 微分误差
    double integral_limit; // 积分项限幅值
    double output_limit; // 输出限幅值
} studio_pid;

// 初始化PID结构体
void init_pid(studio_pid *pid, double init_v, double goal_v, double p, double i, double d,
              double integral_limit_val, double output_limit_val);

// 计算PID输出
double compute_pid(studio_pid *pid, double current_value);

// 设置PID参数
void set_pid_params(studio_pid *pid, double p, double i, double d);

// 设置积分限幅
void set_integral_limit(studio_pid *pid, double limit);

// 设置输出限幅
void set_output_limit(studio_pid *pid, double limit);

// 获取目标值
double get_goal(const studio_pid *pid);

// 重置PID状态
void reset_pid(studio_pid *pid);

// 设置目标值并重置PID状态
void set_goal(studio_pid *pid, double goal_v);


#endif
